home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / metamail / contrib / mms / lib / str_stdio.c next >
Encoding:
C/C++ Source or Header  |  1992-06-30  |  3.8 KB  |  207 lines

  1. /*////////////////////////////////////////////////////////////////////////
  2. Copyright (c) 1992 Electrotechnical Laboratry (ETL)
  3.  
  4. Permission to use, copy, modify, and distribute this material
  5. for any purpose and without fee is hereby granted, provided
  6. that the above copyright notice and this permission notice
  7. appear in all copies, and that the name of ETL not be
  8. used in advertising or publicity pertaining to this
  9. material without the specific, prior written permission
  10. of an authorized representative of ETL.
  11. ETL MAKES NO REPRESENTATIONS ABOUT THE ACCURACY OR SUITABILITY
  12. OF THIS MATERIAL FOR ANY PURPOSE.  IT IS PROVIDED "AS IS",
  13. WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES.
  14. /////////////////////////////////////////////////////////////////////////
  15. Content-Type: program/C; charset=US-ASCII
  16. Program:      str_stdio.h
  17. Author:       Yutaka Sato <ysato@etl.go.jp>
  18. Description:
  19.  
  20.      This program redirects the file I/O from/to strings on memory.
  21.      Include "str_stdio.h" file after <stdio.h>
  22.  
  23. History:
  24.     92.05.18   created
  25. ///////////////////////////////////////////////////////////////////////*/
  26. #include <stdio.h>
  27. typedef unsigned char Uchar;
  28.  
  29. #define Str_MAGIC 0x12345678
  30. typedef struct {
  31.     FILE    s_FILE;
  32.     int    s_magic;
  33.     Uchar  *s_base;
  34.     int    s_peak;
  35.     int    s_maxsize;        /* limit of auto expansion */
  36.     int    s_size;
  37. } String;
  38.  
  39. str_isStr(Str)
  40.     String *Str;
  41. {
  42.     if( Str->s_magic == Str_MAGIC )
  43.         return 1;
  44.     return 0;
  45. }
  46. String *
  47. str_fopen(buf,size)
  48.     unsigned char *buf;
  49. {    String *Str;
  50.  
  51.     Str = (String*)calloc(1,sizeof(String));
  52.     Str->s_magic = Str_MAGIC;
  53.     Str->s_base = buf;
  54.     Str->s_size = size;
  55.     Str->s_peak = 0;
  56.     return Str;
  57. }
  58. str_fclose(Str)
  59.     String *Str;
  60. {
  61.     if( !str_isStr(Str) )
  62.         return fclose(Str);
  63.  
  64.     str_fflush(Str);
  65.     free(Str);
  66.     return 0;
  67. }
  68.  
  69. str_getc(Str)
  70.     String *Str;
  71. {
  72.     if( !str_isStr(Str) )
  73.         return fgetc(Str);
  74.  
  75.     if( Str->s_size <= Str->s_peak )
  76.         return EOF;
  77.  
  78.     return Str->s_base[Str->s_peak++];
  79. }
  80. str_ungetc(ch,Str)
  81.     String *Str;
  82. {
  83.     if( !str_isStr(Str) )
  84.         return ungetc(ch,Str);
  85.  
  86.     if( Str->s_peak <= 0)
  87.         return EOF;
  88.  
  89.     Str->s_base[--Str->s_peak] = ch;
  90.     return ch;
  91. }
  92. char *
  93. str_fgets(buf,size,Str)
  94.     char *buf;
  95.     String *Str;
  96. {    int rsize,nlx;
  97.     Uchar *top,*nlp;
  98.  
  99.     if( !str_isStr(Str) )
  100.         return fgets(buf,size,Str);
  101.  
  102.     rsize = Str->s_size - Str->s_peak;
  103.     if( rsize <= 0 )
  104.         return NULL;
  105.     if( rsize < size )
  106.         size = rsize;
  107.  
  108.     top = &Str->s_base[Str->s_peak];
  109.     for(nlx = 0; nlx < rsize; nlx++)
  110.         if( top[nlx] == '\n' ){
  111.             size = nlx+1;
  112.             break;
  113.         }
  114.     strncpy(buf,top,size);
  115.     Str->s_peak += size;
  116.     buf[size] = 0;
  117.     return buf;
  118. }
  119.  
  120. str_putc(ch,Str)
  121.     String *Str;
  122. {
  123.     if( !str_isStr(Str) )
  124.         return fputc(ch,Str);
  125.  
  126.     if( Str->s_size <= Str->s_peak )
  127.         return EOF;
  128.  
  129.     Str->s_base[Str->s_peak++] = ch;
  130.  
  131.     return ch;
  132. }
  133. str_fputs(buf,Str)
  134.     char *buf;
  135.     String *Str;
  136. {    int size,rsize;
  137.  
  138.     if( !str_isStr(Str) )
  139.         return fputs(buf,Str);
  140.  
  141.     rsize = Str->s_size - Str->s_peak;
  142.     if( rsize <= 0 )
  143.         return EOF;
  144.  
  145.     size = strlen(buf);
  146.     if( size == 0 )
  147.         return;
  148.     if( rsize < size )
  149.         size = rsize;
  150.  
  151.     strncpy(&Str->s_base[Str->s_peak],buf,size);
  152.     Str->s_peak += size;
  153.  
  154.     return 0;
  155. }
  156.  
  157. str_fflush(Str)
  158.     String *Str;
  159. {
  160.     if( !str_isStr(Str) )
  161.         return fflush(Str);
  162.  
  163.     Str->s_base[Str->s_peak] = 0;
  164.     return 0;
  165. }
  166. str_fprintf(Str,form,a,b,c,d,e,f)
  167.     String *Str;
  168. {    int wlen;
  169.     unsigned char *peakp;
  170.  
  171.     if( !str_isStr(Str) )
  172.         return fprintf(Str,form,a,b,c,d,e,f);
  173.  
  174.     peakp = &Str->s_base[Str->s_peak];
  175.     sprintf(peakp,form,a,b,c,d,e,f);
  176.     wlen = strlen(peakp);
  177.  
  178.     Str->s_peak += wlen;
  179.     return  wlen;
  180. }
  181. str_fseek(Str,off,where)
  182.     String *Str;
  183. {    int noff;
  184.  
  185.     if( !str_isStr(Str) )
  186.         return fseek(Str,off,where);
  187.  
  188.     switch( where ){
  189.         case 0: noff = off; break;
  190.         case 1: noff = Str->s_peak + off; break;
  191.         case 2: noff = Str->s_size-1 + off; break;
  192.         default: return -1;
  193.     }
  194.  
  195.     if( noff < 0 || Str->s_size <= noff )
  196.         return -1;
  197.     Str->s_peak = noff;
  198. }
  199. str_ftell(Str)
  200.     String *Str;
  201. {
  202.     if( !str_isStr(Str) )
  203.         return ftell(Str);
  204.  
  205.     return Str->s_peak;
  206. }
  207.